/*
 * Copyright (c) 2023, LXMS (lxinet.cn).
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package cn.lxinet.lxms.framework.mybatis.mapper;

import cn.lxinet.lxms.framework.core.vo.Page;
import cn.lxinet.lxms.framework.mybatis.conditions.SqlWrapper;
import cn.lxinet.lxms.framework.mybatis.provider.SqlProvider;
import org.apache.ibatis.annotations.*;

import java.util.Collection;
import java.util.List;

/**
 * @author zcx
 * @date 2023/07/26
 */
@Mapper
public interface BaseMapper<T> {

    @InsertProvider(type = SqlProvider.class, method = "insert")
    @Options(useGeneratedKeys = true, keyProperty = "id")
    void insert(T t);

    @InsertProvider(type = SqlProvider.class, method = "batchInsert")
    void batchInsert(@Param("list") Collection<T> list, @Param("c") Class<?> c);

    @SelectProvider(type = SqlProvider.class, method = "selectList")
    List<T> selectList(SqlWrapper<T> sqlWrapper);

    @SelectProvider(type = SqlProvider.class, method = "selectPage")
    List<T> selectPage(@Param("page") Page page, @Param("sqlWrapper") SqlWrapper<T> sqlWrapper);

    @UpdateProvider(type = SqlProvider.class, method = "updateById")
    int updateById(T t);

    @SelectProvider(type = SqlProvider.class, method = "selectById")
    T selectById(@Param("id") Long id, @Param("c") Class<?> c);

    @SelectProvider(type = SqlProvider.class, method = "selectByIds")
    List<T> selectByIds(@Param("ids") List<Long> ids, @Param("c") Class<?> c);

    @UpdateProvider(type = SqlProvider.class, method = "deleteById")
    int deleteById(@Param("id") Long id, @Param("c") Class<?> c);

    @UpdateProvider(type = SqlProvider.class, method = "delete")
    int delete(T t);

}
